Interactive Maps

Author

Aaron Kessler

Published

December 12, 2023

Interactive Maps with MapView Package

A h/t to Sharon Machlis for turning people on to the Mapview package, and her excellent walkthroughs of it.

For the data tonight we’ll be using the tidycensus package to pull both census data, as well as geospatial boundaries. Let’s quickly review how we use it.

census_api_key("2a6f8c21a30d3024e038d67d7d4eba647dc79cd4", overwrite=TRUE)
To install your API key for use in future sessions, run this function with `install = TRUE`.
#chose variables we want
myvars <- c(totalpop = "B01003_001",
            medincome = "B19013_001",
            medage = "B01002_001"
)
#pull for NY counties
NY_counties_withgeo <- get_acs(geography = "county",
                       variables = c(myvars),
                       state = "NY",
                       output = "wide",
                       geometry = TRUE)
Getting data from the 2017-2021 5-year ACS
Downloading feature geometry from the Census website.  To cache shapefiles for use in future sessions, set `options(tigris_use_cache = TRUE)`.

  |                                                                            
  |                                                                      |   0%
  |                                                                            
  |                                                                      |   1%
  |                                                                            
  |=                                                                     |   1%
  |                                                                            
  |=                                                                     |   2%
  |                                                                            
  |==                                                                    |   2%
  |                                                                            
  |==                                                                    |   3%
  |                                                                            
  |===                                                                   |   4%
  |                                                                            
  |===                                                                   |   5%
  |                                                                            
  |====                                                                  |   5%
  |                                                                            
  |====                                                                  |   6%
  |                                                                            
  |=====                                                                 |   7%
  |                                                                            
  |======                                                                |   8%
  |                                                                            
  |======                                                                |   9%
  |                                                                            
  |=======                                                               |  10%
  |                                                                            
  |=======                                                               |  11%
  |                                                                            
  |========                                                              |  11%
  |                                                                            
  |========                                                              |  12%
  |                                                                            
  |=========                                                             |  13%
  |                                                                            
  |==========                                                            |  14%
  |                                                                            
  |============                                                          |  17%
  |                                                                            
  |=================                                                     |  24%
  |                                                                            
  |======================                                                |  31%
  |                                                                            
  |===========================                                           |  38%
  |                                                                            
  |================================                                      |  46%
  |                                                                            
  |=====================================                                 |  53%
  |                                                                            
  |==========================================                            |  60%
  |                                                                            
  |===============================================                       |  67%
  |                                                                            
  |====================================================                  |  74%
  |                                                                            
  |=========================================================             |  81%
  |                                                                            
  |==============================================================        |  89%
  |                                                                            
  |===================================================================   |  96%
  |                                                                            
  |======================================================================| 100%
NY_counties_withgeo
Simple feature collection with 62 features and 8 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -79.76215 ymin: 40.4961 xmax: -71.85621 ymax: 45.01585
Geodetic CRS:  NAD83
First 10 features:
   GEOID                         NAME totalpopE totalpopM medincomeE medincomeM
1  36017    Chenango County, New York     47407        NA      55690       2603
2  36119 Westchester County, New York    999723        NA     105387       1643
3  36025    Delaware County, New York     44644        NA      52757       2293
4  36115  Washington County, New York     61504        NA      63869       2006
5  36075      Oswego County, New York    118019        NA      61983       2218
6  36067    Onondaga County, New York    474621        NA      66012       1000
7  36113      Warren County, New York     65692        NA      68765       3677
8  36051  Livingston County, New York     62253        NA      64467       2308
9  36009 Cattaraugus County, New York     77211        NA      53537       1681
10 36105    Sullivan County, New York     78230        NA      63393       2692
   medageE medageM                       geometry
1     44.7     0.2 MULTIPOLYGON (((-75.88983 4...
2     41.2     0.2 MULTIPOLYGON (((-73.77278 4...
3     48.5     0.3 MULTIPOLYGON (((-75.42264 4...
4     44.4     0.3 MULTIPOLYGON (((-73.63622 4...
5     40.7     0.4 MULTIPOLYGON (((-76.61693 4...
6     39.3     0.2 MULTIPOLYGON (((-76.49931 4...
7     46.8     0.3 MULTIPOLYGON (((-74.21462 4...
8     41.7     0.5 MULTIPOLYGON (((-78.06075 4...
9     42.3     0.4 MULTIPOLYGON (((-79.05908 4...
10    42.3     0.4 MULTIPOLYGON (((-75.14468 4...
#all counties in the US
all_counties_withgeo <- get_acs(geography = "county",
                       variables = c(myvars),
                       output = "wide",
                       geometry = TRUE)
Getting data from the 2017-2021 5-year ACS
Downloading feature geometry from the Census website.  To cache shapefiles for use in future sessions, set `options(tigris_use_cache = TRUE)`.
all_counties_withgeo
Simple feature collection with 3221 features and 8 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -179.1489 ymin: 17.88328 xmax: 179.7785 ymax: 71.36516
Geodetic CRS:  NAD83
First 10 features:
   GEOID                              NAME totalpopE totalpopM medincomeE
1  20161              Riley County, Kansas     72602        NA      53296
2  19159             Ringgold County, Iowa      4739        NA      57700
3  30009            Carbon County, Montana     10488        NA      63178
4  16007           Bear Lake County, Idaho      6327        NA      60337
5  55011         Buffalo County, Wisconsin     13314        NA      61167
6  31185             York County, Nebraska     14164        NA      66337
7  08037            Eagle County, Colorado     55693        NA      91338
8  42129 Westmoreland County, Pennsylvania    355107        NA      64708
9  40079         Le Flore County, Oklahoma     48436        NA      43049
10 48053              Burnet County, Texas     48424        NA      65363
   medincomeM medageE medageM                       geometry
1        2489    25.5     0.1 MULTIPOLYGON (((-96.96095 3...
2        5058    44.3     1.0 MULTIPOLYGON (((-94.47167 4...
3        4261    50.7     0.9 MULTIPOLYGON (((-109.7987 4...
4        7039    38.9     1.1 MULTIPOLYGON (((-111.6345 4...
5        2352    46.5     0.5 MULTIPOLYGON (((-92.08384 4...
6        4128    39.5     1.2 MULTIPOLYGON (((-97.82629 4...
7        4058    37.8     0.8 MULTIPOLYGON (((-107.1137 3...
8        1350    47.1     0.2 MULTIPOLYGON (((-79.90487 4...
9        1869    38.8     0.3 MULTIPOLYGON (((-95.05996 3...
10       4694    44.7     0.3 MULTIPOLYGON (((-98.45924 3...
#remove MOE columns - they all end with "M"
NY_counties_withgeo <- NY_counties_withgeo %>%
  select(-ends_with("M"))

NY_counties_withgeo
Simple feature collection with 62 features and 5 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -79.76215 ymin: 40.4961 xmax: -71.85621 ymax: 45.01585
Geodetic CRS:  NAD83
First 10 features:
   GEOID                         NAME totalpopE medincomeE medageE
1  36017    Chenango County, New York     47407      55690    44.7
2  36119 Westchester County, New York    999723     105387    41.2
3  36025    Delaware County, New York     44644      52757    48.5
4  36115  Washington County, New York     61504      63869    44.4
5  36075      Oswego County, New York    118019      61983    40.7
6  36067    Onondaga County, New York    474621      66012    39.3
7  36113      Warren County, New York     65692      68765    46.8
8  36051  Livingston County, New York     62253      64467    41.7
9  36009 Cattaraugus County, New York     77211      53537    42.3
10 36105    Sullivan County, New York     78230      63393    42.3
                         geometry
1  MULTIPOLYGON (((-75.88983 4...
2  MULTIPOLYGON (((-73.77278 4...
3  MULTIPOLYGON (((-75.42264 4...
4  MULTIPOLYGON (((-73.63622 4...
5  MULTIPOLYGON (((-76.61693 4...
6  MULTIPOLYGON (((-76.49931 4...
7  MULTIPOLYGON (((-74.21462 4...
8  MULTIPOLYGON (((-78.06075 4...
9  MULTIPOLYGON (((-79.05908 4...
10 MULTIPOLYGON (((-75.14468 4...
#remove that trailing "E"
colnames(NY_counties_withgeo) <- sub("E$", "", colnames(NY_counties_withgeo)) # $ means end of string only

NY_counties_withgeo
Simple feature collection with 62 features and 5 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -79.76215 ymin: 40.4961 xmax: -71.85621 ymax: 45.01585
Geodetic CRS:  NAD83
First 10 features:
   GEOID                          NAM totalpop medincome medage
1  36017    Chenango County, New York    47407     55690   44.7
2  36119 Westchester County, New York   999723    105387   41.2
3  36025    Delaware County, New York    44644     52757   48.5
4  36115  Washington County, New York    61504     63869   44.4
5  36075      Oswego County, New York   118019     61983   40.7
6  36067    Onondaga County, New York   474621     66012   39.3
7  36113      Warren County, New York    65692     68765   46.8
8  36051  Livingston County, New York    62253     64467   41.7
9  36009 Cattaraugus County, New York    77211     53537   42.3
10 36105    Sullivan County, New York    78230     63393   42.3
                         geometry
1  MULTIPOLYGON (((-75.88983 4...
2  MULTIPOLYGON (((-73.77278 4...
3  MULTIPOLYGON (((-75.42264 4...
4  MULTIPOLYGON (((-73.63622 4...
5  MULTIPOLYGON (((-76.61693 4...
6  MULTIPOLYGON (((-76.49931 4...
7  MULTIPOLYGON (((-74.21462 4...
8  MULTIPOLYGON (((-78.06075 4...
9  MULTIPOLYGON (((-79.05908 4...
10 MULTIPOLYGON (((-75.14468 4...

Mapping Virginia counties with mapview

mapview(NY_counties_withgeo, zcol = "medincome")

Customize colors

mapview(NY_counties_withgeo, zcol = "medincome", 
         col.regions = RColorBrewer::brewer.pal(9, "Greens"), 
         alpha.regions = 1)
Warning: Found less unique colors (9) than unique zcol values (62)! 
Interpolating color vector to match number of zcol values.

This map’s dark background appeared automatically, because mapview determined the map included a lot of light colors. You can turn off that feature.

mapviewOptions("basemaps.color.shuffle" = FALSE)
mapview(NY_counties_withgeo, zcol = "medincome", 
         col.regions = RColorBrewer::brewer.pal(9, "Greens"), 
         alpha.regions = 1)
Warning: Found less unique colors (9) than unique zcol values (62)! 
Interpolating color vector to match number of zcol values.

Two maps together

map_income <- mapview(NY_counties_withgeo, zcol = "medincome", 
         col.regions = RColorBrewer::brewer.pal(9, "Greens"), 
         alpha.regions = 1)
Warning: Found less unique colors (9) than unique zcol values (62)! 
Interpolating color vector to match number of zcol values.
map_age <- mapview(NY_counties_withgeo, zcol = "medage", 
         col.regions = RColorBrewer::brewer.pal(9, "Greens"), 
         alpha.regions = 1)
Warning: Found less unique colors (9) than unique zcol values (51)! 
Interpolating color vector to match number of zcol values.
sync(map_income, map_age)

Side-by-side slider to compare the two, from the leaflet.extras2 package

map_income | map_age

To turn off legends, hover text, popups

mapview(NY_counties_withgeo, zcol = "medincome", 
         col.regions = RColorBrewer::brewer.pal(9, "Greens"), 
         alpha.regions = 1,
         legend = FALSE, 
         label = FALSE, 
         popup = FALSE)
Warning: Found less unique colors (9) than unique zcol values (62)! 
Interpolating color vector to match number of zcol values.

Customize labels

mylabel <- glue::glue("{NY_counties_withgeo$NAM} {NY_counties_withgeo$medincome}")


mapview(NY_counties_withgeo, zcol = "medincome", 
         col.regions = RColorBrewer::brewer.pal(9, "Greens"), 
         alpha.regions = 1,
         label = mylabel)
Warning: Found less unique colors (9) than unique zcol values (62)! 
Interpolating color vector to match number of zcol values.

Customize popups

mypopup <- glue::glue("<strong>{NY_counties_withgeo$NAM}</strong><br />
                      Total Population: {NY_counties_withgeo$totalpop}<br />
                      Median Income: {NY_counties_withgeo$medincome}") %>% 
  lapply(htmltools::HTML)

# mylabel <- glue::glue("{all_data$State} {all_data$PctChange10_20}%") %>%
#   lapply(htmltools::HTML)
head(mypopup)
[[1]]
<strong>Chenango County, New York</strong><br />
Total Population: 47407<br />
Median Income: 55690

[[2]]
<strong>Westchester County, New York</strong><br />
Total Population: 999723<br />
Median Income: 105387

[[3]]
<strong>Delaware County, New York</strong><br />
Total Population: 44644<br />
Median Income: 52757

[[4]]
<strong>Washington County, New York</strong><br />
Total Population: 61504<br />
Median Income: 63869

[[5]]
<strong>Oswego County, New York</strong><br />
Total Population: 118019<br />
Median Income: 61983

[[6]]
<strong>Onondaga County, New York</strong><br />
Total Population: 474621<br />
Median Income: 66012
mapview(NY_counties_withgeo, zcol = "medincome", 
         col.regions = RColorBrewer::brewer.pal(9, "Greens"), 
         alpha.regions = 1,
         popup = mypopup)
Warning: Found less unique colors (9) than unique zcol values (62)! 
Interpolating color vector to match number of zcol values.